package com.demo.test.mongodb;

import com.demo.test.mongodb.pojo.BucketResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.BucketOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.stereotype.Service;

@SpringBootTest
public class StudentAggregationService {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void aggregateByScoreAndGrade() {
        // 第一阶段：按 score 字段分桶
        BucketOperation bucketByScore = Aggregation.bucket("score") // 按 score 字段进行分桶
                .withBoundaries(0, 50, 70, 90, 100) // 设置分桶边界
                .andOutput("name").push().as("students") // 收集每个桶中的学生姓名
                .andOutput("score").sum().as("totalScore") // 每个桶中的分数总和
                .andOutput("grade").push().as("grades"); // 收集每个桶中的年级字段

//        // 第二阶段：在每个桶内按 grade 字段再次进行分桶
//        BucketOperation bucketByGrade = Aggregation.bucket("grades") // 再次根据 grades 字段进行分桶
//                .withBoundaries("A", "B", "C") // 设置年级分桶的边界
//                .andOutput("students").push().as("studentsInGrade") // 收集每个桶中的学生姓名
//                .andOutput("count").count().as("studentCount"); // 计算每个分桶中的学生数量

        // 聚合查询的组合
        Aggregation aggregation = Aggregation.newAggregation(
                bucketByScore// 第一阶段的分桶
//                Aggregation.unwind("students"), // 展开第一阶段桶中的学生数据
//                bucketByGrade // 第二阶段的分桶
        );

        // 执行聚合查询
        AggregationResults<BucketResult> results = mongoTemplate.aggregate(aggregation, "students", BucketResult.class);

        // 打印结果
        results.getMappedResults().forEach(result -> {
            System.out.println("Bucket: " + result);
        });
    }
}
